<template>
  <div class="audition130">
    <h3><strong>什么是执行上下文？</strong></h3>
    <p>当 JS 引擎解析到可执行代码片段（通常是函数调用阶段）的时候，就会先做一些执行前的准备工作，</p>
    <p>这个 “准备工作”，就叫做 "执行上下文(execution context 简称 EC)" 或者也可以叫做执行环境。</p>
    <h3><strong>执行上下文的类型：</strong></h3>
    <p>1. 全局执行上下文</p>
    <p>这是默认或者说是最基础的执行上下文，一个程序中只会存在一个全局上下文，</p>
    <p>它在整个 javascript 脚本的生命周期内都会存在于执行堆栈的最底部不会被栈弹出销毁。</p>
    <p>全局上下文会生成一个全局对象（以浏览器环境为例，这个全局对象是 window），并且将 this 值绑定到这个全局对象上。</p>
    <p>2. 函数执行上下文</p>
    <p>每当一个函数被调用时，都会创建一个新的函数执行上下文（不管这个函数是不是被重复调用的）</p>
    <p>3. Eval 函数执行上下文</p>
    <p>执行在 eval 函数内部的代码也会有它属于自己的执行上下文</p>
    <h3><strong>执行上下文的内容:</strong></h3>
    <p>1. 变量对象</p>
    <p>会做以下事情：</p>
    <p>1.1 检查当前执行环境的参数列表，创建<span class="color">arguments</span>对象。</p>
    <p>1.2 预编译，检查函数声明和变量声明</p>
    <p>2. 活动对象</p>
    <p>2.1 函数进入执行阶段时，原本不能访问的变量对象被激活成为一个活动对象，自此，我们可以访问到其中的各种属性。</p>
    <p>其实变量对象和活动对象是一个东西，只不过处于不同的状态和阶段而已。</p>
    <p>3. 作用域链</p>
    <p><strong>作用域</strong> 规定了如何查找变量，也就是确定当前执行代码对变量的访问权限。<br />当查找变量的时候，会先从当前上下文的变量对象中查找，如果没有找到，就会从父级（词法层面上的<br />父级）执行上下文的变量对象中查找，一直找到全局上下文的变量对象，<br />也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做 <strong>作用域链</strong>。</p>
    <p>4. 调用者信息</p>
    <p>如果当前函数被作为对象方法调用或使用 bind call apply 等 API 进行委托调用，<br />则将当前代码块的调用者信息（this value）存入当前执行上下文，<br />否则默认为全局对象调用。</p>
    <hr>
    <p>推荐阅读：<a href="https://zhuanlan.zhihu.com/p/141582658" target="_blank">执行上下文的理解</a></p>
  </div>
</template>

<script>
export default {
  name: 'Audition130'
}
</script>

<style>

</style>